#!/bin/bash

# 脚本第一个参数控制起始job_id
s=$1
# 脚本第二个参数控制下载个数， 与第三个参数形成冲突
l=$2
# 脚本第三个参数控制下载终止数, 如果没有则使用第一个参数加第二个参数的和
# 如果设置了第三个参数，则第二个参数无意义
e=$3
# 是否有第一个参数的标识符 NULL为没有指定第一个参数
sflags=${1-NULL}
url=https://www.lagou.com/jobs/
root=$(pwd)
savedir=$root/lagou_html
runId=$savedir/run.id
taskfile=$savedir/lagou.task
logfile=$savedir/lagou.log
parselog=$savedir/parse.log
savefile=""

err() {
    echo $1
    exit $2
}

count_end_id() {
    # 没有指定结束ID进行判断长度进行计算结束ID
    if test -z $e ; then
        # 指定长度则按指定长度计算，否则默认按100000计算结束ID
        test -z $l && e=$[s + 100000] || e=$[s + l]
    fi
}

create_task_file() {
    # 没有指定起始ID报错
    test -z $s && err "错误: 请指定任务起始ID!"
    echo $s > $taskfile
    count_end_id
    echo $e >> $taskfile
}

get_range() {
    # 任务文件不存在
    if ! test -e $taskfile ; then
        create_task_file
    else
        # 任务文件存在, 第一个参数为空, 获取上一次断点位置或起始值
        if test -z $s ; then
            s=$(cat $runId 2> /dev/null || sed -n '1p' $taskfile 2> /dev/null)
            test -z $s && err "错误: 请指定任务起始ID!"
            e=$(sed -n '2p' $taskfile 2> /dev/null)
            test -z $e && err "错误: 请指定任务结束ID!"
        else
            # 如果任务文件存在并且指定第一个参数，则从文件中获取结束值
            # 如果指定两个参数则覆盖上次任务，重新开始
            test -z $l && e=$(sed -n '2p' $taskfile 2> /dev/null)
            create_task_file
        fi
    fi
    test $s -ge $e && err "错误: 范围指定不合法!"
}

init() {
    # 判断下载目录是否为普通文件
    test -f $savedir && err "$savedir 不是目录!" 1
    # 判断下载目录是否存在，不存在创建
    test ! -d $savedir && mkdir -p $savedir

    # 获取下载范围
    get_range

    # 设置解析日志文件路径
    export KYO_LAGOU_LOG=$parselog
}

down_url() {
    # 定义存储下载文件的变量
    local file=$1
    # 设置此次下载保存文件的路径
    savefile=$savedir/$file
    # 防止下载失败，重复下载
    while : ; do
        # 下载日志记录
        echo "[$(date +"%F %T")]$file downloading..." >> $logfile
        # 下载文件
        curl $url$file -o $savefile
        # 延时等待 否则会封IP
        sleep 12
        # 判断目标网页不存在则删除临时下载文件并且退出
        grep -q "亲，你来晚了，该信息已经被删除鸟" $savefile && rm $savefile -f
        test ! -e $savefile && return 1

        # 判断下载网页为封IP的信息则重新下载
        local size=$(ls -l $savefile | awk '{print $5}')
        test $size -gt 242 && break
    done

    return 0
}

# 准备工作
init

# 调试信息
echo $s $e
# exit

# 循环范围下载并且解析入库
for i in $(seq $s $e) ; do
    down_url $i.html && ./parse_file.sh $savefile
    # 记录下载解析的job_id, 以便重新开始
    echo $i > $runId
done
